/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package enviosms;

import com.human.gateway.client.ClientHumanException;
import com.human.gateway.client.ClienteHuman;
import com.human.gateway.client.MensagemIndividual;
import com.human.gateway.client.MensagemMultipla;
import com.human.gateway.client.Retorno;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author isabela
 */
public class Sms {

    private ClienteHuman sistemaEnvio;
    private static Sms instace;
    final static Boolean ENVIADA = true;
    final static Boolean NAO_ENVIADA = false;

    private File arquivoErros;//arquivo para controle dos erros ocorridos ao tentar enviar a msg
    private FileOutputStream fos;

    private String statusMsg;//mensagem que será exibida na tela informando se ocorreu erro ou a msg foi enviada c sucesso

    private Sms() {
        sistemaEnvio = new ClienteHuman();

        //atribuindo os parâmetros de envio: conta, senha, proxy e porta
        sistemaEnvio.setAccount("teste");
        sistemaEnvio.setCode("123456");
        sistemaEnvio.setProxyHost("10.65.16.2");
        sistemaEnvio.setProxyPort(3128);

        arquivoErros = new File("logErros.txt");
        try {
            fos = new FileOutputStream(arquivoErros, true);
        }
        catch (FileNotFoundException ex) {
            Logger.getLogger(Sms.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static Sms getInstance(){

        if(instace == null)//criando a primeira(única) instancia do Objeto
            instace = new Sms();

        return instace;
    }

 /**
 * Retorna uma String contendo o respectivo atributo do aluno passado como parâmetro.
 *
 * @param  destinos um arraylist de destinos contendo as diversas mensagens que serão enviadas
 * @return uma String contendo o status de envio das mensagens
 *
 */

    public String enviarMensagemGrupo(ArrayList<Destino> destinos){

        String list = null;//String que irá concatenar a lista do Grupo que irá receber a mensagem


        for(int i = 0; i < destinos.size(); i++){

            Destino d = destinos.get(i);
            if(i == 0)//para garantir que na primeira linha o "null" não será concatenado
                list = d.getCelular() + ";" + d.getMsg().getCorpoMsg() + ";" + d.getId_Destino() + ";" + d.getMsg().getRemetente() + "\n";
            else
                list += d.getCelular() + ";" + d.getMsg().getCorpoMsg() + ";" + d.getId_Destino() + ";" + d.getMsg().getRemetente() + "\n";

        }

        MensagemMultipla msgM = new MensagemMultipla();
        msgM.setType(MensagemMultipla.TYPE_D);//atribui o formato em que a lista será enviada
        msgM.setList(list);


        ArrayList<Retorno> retorno;
        try {
            retorno = (ArrayList<Retorno>) sistemaEnvio.send(msgM, ClienteHuman.CALLBACK_FINAL);

            //laço para a verificação do envio ou não das msgs
            for(int i = 0; i<retorno.size(); i++){
                Retorno aux = retorno.get(i);
                String erro;
                if (!aux.getReturnCode().equals("200")) {
                    if (aux.isError()) {//se houver erro o status da msg recebe "false"
                        destinos.get(i).setStatus(NAO_ENVIADA);
                        //verifica se houve algum erro que possa ter sido provocado pelo usuário
                        if (aux.getReturnCode().equals("010") || aux.getReturnCode().equals("011") || aux.getReturnCode().equals("011")) {
                            if (aux.getReturnCode().equals("010")) {
                                statusMsg = "Mensagem Vazia!";
                            }
                            else if (aux.getReturnCode().equals("011")) {
                                statusMsg = "Corpo da mensagem inválido!";
                            }
                            else if (aux.getReturnCode().equals("011")) {
                                statusMsg = "Corpo da mensagem excedeu o limite!";
                            }
                        }
                        else {
                            statusMsg = "Ocorreu um erro no sistema. Por favor, tente novamente mais tarde.";
                            //verificação p erros gerais, onde o restante das msgs tb n poderão ser enviadas
                            if (aux.getReturnCode().equals("900") || aux.getReturnCode().equals("990") || aux.getReturnCode().equals("998") || aux.getReturnCode().equals("999") || aux.getReturnCode().equals("210")) {
                                //laço para marcar o status da msg atual até a ultima como "Não Enviada"
                                for (int j = i; j < destinos.size() - i; j++) {
                                    destinos.get(j).setStatus(NAO_ENVIADA);
                                }
                            }
                            erro = "**Mensagem para Grupo**\n" + "Remetente: " + destinos.get(i).getMsg().getRemetente() + "\nDestinatario: " + destinos.get(i).getAluno_destino();
                            erro += "\nCelular: " + destinos.get(i).getCelular() + "\nData: " + destinos.get(i).getMsg().getData() + "\nID: " + destinos.get(i).getId_Destino();
                            erro += "\nCodigo: " + aux.getReturnCode() + "\nDescrição: " + aux.getReturnDescription();
                            erro += "\n***********************************************************************************\n";
                            
                            fos.write(erro.getBytes());//escrevendo no arquivo                         
                        }
                    }
                    else {//se não houver erro o status da msg recebe "true"
                        destinos.get(i).setStatus(ENVIADA);
                        statusMsg = "Mensagem enviada com sucesso";
                    }
                }

            }

         }
         catch (ClientHumanException ex) {
            String log="Erro: "+ex.getMessage()+"\nData: "+destinos.get(0).getMsg().getData();
            try {
                fos.write( log.getBytes());//escrevendo no arquivo
            }
            catch (IOException a) {
                 Logger.getLogger(Sms.class.getName()).log(Level.SEVERE, null, a);
            }

         }
         catch (IOException e1) {
            Logger.getLogger(Sms.class.getName()).log(Level.SEVERE, null, e1);
         }

        finally{
            return statusMsg;
        }

    }
  /**
 * Retorna uma String informando o status da mensagem, se foi enviada com sucesso ou não.
 *
 * @param  msg  um objeto do tipo Destino que contém as informações da mensagem que será enviada 
 * @return uma String contendo o status da mensagem
 *
 */

    public String enviarMensagemIndividual(Destino msg) {
        MensagemIndividual msgUnica = new MensagemIndividual();
        msgUnica.setFrom(msg.getMsg().getRemetente());
        msgUnica.setTo(msg.getCelular());
        msgUnica.setId(String.valueOf(msg.getId_Destino()));
        msgUnica.setMsg(msg.getMsg().getCorpoMsg());

        System.out.println("destino "+ msg.getCelular());

        List<Retorno> retorno = null;

        try {
           retorno = sistemaEnvio.send(msgUnica, ClienteHuman.CALLBACK_FINAL);
           for (int i = 0; i < retorno.size(); i++) {            
                Retorno aux =  retorno.get(i);
                String erro;

                if(aux.isError()){
                    msg.setStatus(NAO_ENVIADA);
                    //verifica se houve algum erro que possa ter sido provocado pelo usuário
                    if(aux.getReturnCode().equals("010") || aux.getReturnCode().equals("011") || aux.getReturnCode().equals("011")){
                        if(aux.getReturnCode().equals("010"))
                            statusMsg = "Mensagem Vazia!";
                        else if(aux.getReturnCode().equals("011"))
                            statusMsg = "Corpo da mensagem inválido!";
                        else if( aux.getReturnCode().equals("011"))
                            statusMsg = "Corpo da mensagem excedeu o limite!";
                    }

                    else{
                        statusMsg = "Ocorreu um erro no sistema. Por favor, tente novamente mais tarde.";

                        erro = "**Mensagem Individual**\n" + "Remetente: " + msg.getMsg().getRemetente() + "\nDestinatario: " + msg.getAluno_destino();
                        erro += "\nCelular: " + msg.getCelular() + "\nData: " + msg.getMsg().getData() + "\nID: " + msg.getId_Destino();
                        erro += "\nCodigo: " + aux.getReturnCode() + "\nDescrição: " + aux.getReturnDescription();
                        erro += "\n***********************************************************************************\n";
                        
                        fos.write(erro.getBytes());//escrevendo no arquivo
                                
                    }

                }
                else{
                    msg.setStatus(ENVIADA);
                    statusMsg = "Mensagem enviada com sucesso";
                }
           }
        }
        catch (ClientHumanException ex) {
          String log="Erro: "+ex.getMessage()+"\nData: "+msg.getMsg().getData();
            try {
                fos.write( log.getBytes());//escrevendo no arquivo
            }
            catch (IOException a) {
                 Logger.getLogger(Sms.class.getName()).log(Level.SEVERE, null, a);
            }
        }
        catch (IOException ex) {
            Logger.getLogger(Sms.class.getName()).log(Level.SEVERE, null, ex);
        }

        finally{
            return statusMsg;
        }
    }

}
